package com.xiaoxie.cloud.apis;

import com.xiaoxie.cloud.entities.PayDTO;
import com.xiaoxie.cloud.resp.ResultData;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;

// @FeignClient("cloud-payment-service")   // 这里value指定服务的名称，需要与consul中保持一致
@FeignClient("cloud-gateway")
public interface PayFeignApi {

    // 方法上使用的 HTTP 方法注解（如 @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 等）与服务提供者 Controller 中的方法注解一致
    /**
     * 新增支付信息
     * 对于 @RequestBody 注解，确保请求体的 JSON 结构和类型 与 服务提供者的保持一致。
     * @param payDTO
     * @return
     */
    @GetMapping("/pay/add")
    ResultData addPay(@RequestBody PayDTO payDTO);

    /**
     * 根据id获取支付信息
     * 服务提供者的方法使用了 @RequestParam 或 @PathVariable 注解，那么在接口方法中也需要使用相同的注解，并且参数名称和类型要一致
     * @param id
     * @return
     */
    @GetMapping("/pay/get/{id}")
    ResultData getPayInfo(@PathVariable("id") Integer id);

    /**
     * 获取服务信息（演示）
     * @return
     */
    @GetMapping("/pay/get/info")
    String mylb();

    /**
     * Resilience4j 测试
     * @param id
     * @return
     */
    @GetMapping("/pay/circuit/{id}")
    String myCircuit(@PathVariable("id") Integer id);

    /**
     * Bulkhead 测试
     * @param id
     * @return
     */
    @GetMapping("/pay/bulkhead/{id}")
    String myBulkhead(@PathVariable("id") Integer id);

    /**
     * RateLimit 测试
     */
    @GetMapping("/pay/ratelimit/{id}")
    String myRatelimit(@PathVariable("id") Integer id);


    /**
     * Micrometer 测试
     * @param id
     * @return
     */
    @GetMapping("/pay/micrometer/{id}")
    String myMicrometer(@PathVariable("id") Integer id);


    /**
     * GateWay进行网关测试案例01
     * @param id
     * @return
     */
    @GetMapping(value = "/pay/gateway/get/{id}")
    ResultData getById(@PathVariable("id") Integer id);

    /**
     * GateWay进行网关测试案例02
     * @return
     */
    @GetMapping(value = "/pay/gateway/info")
    ResultData<String> getGatewayInfo();


}
